/**
 * 作者：
 * 创建时间：2012-8-14 下午3:50:42
 */
package dragon.model.intercept;

import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import dragon.core.exception.ExceptionHandler;
import dragon.model.bizObject.BizObject;
import ejp.Database;
import ejw.ServerInterface;

/**
 * 实现功能：业务模型对象操作拦截
 */
public abstract class Interceptor {

	/**
	 * 日志对象
	 */
	public Logger logger = LoggerFactory.getLogger(Interceptor.class);

	/**
	 * 包含了默认和后置操作(如果有)
	 */
	public static int INCLUDE_ALL = 0;

	/**
	 * 包含了默认操作，但排除了后置操作(如果有)
	 */
	public static int INCLUDE_DEFAULT = 1;

	/**
	 * 排除了默认操作，但包含了后置操作(如果有)
	 */
	public static int INCLUDE_AFTER = 2;

	/**
	 * 排除了默认和后置操作(如果有)
	 */
	public static int EXCLUDE_ALL = 3;

	/**
	 * loadData前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public int beforeLoadData(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforeLoadData 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * loadData后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public void afterLoadData(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterLoadData 方法");
		}
	}

	/**
	 * PreAdd前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public int beforePreAdd(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforePreAdd 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * PreAdd后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public void afterPreAdd(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterPreAdd 方法");
		}
	}

	/**
	 * ADD前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @param db
	 *            数据库操作对象
	 * @throws ExceptionHandler
	 */
	public int beforeAdd(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif, Database db) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforeAdd 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * ADD后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @param db
	 *            数据库操作对象
	 * @throws ExceptionHandler
	 */
	public void afterAdd(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif, Database db) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterAdd 方法");
		}
	}

	/**
	 * PreMod前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public int beforePreMod(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforePreMod 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * PreMod后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public void afterPreMod(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterPreMod 方法");
		}
	}

	/**
	 * MOD前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @param db
	 *            数据库操作对象
	 * @throws ExceptionHandler
	 */
	public int beforeMod(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif, Database db) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforeMod 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * MOD后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @param db
	 *            数据库操作对象
	 * @throws ExceptionHandler
	 */
	public void afterMod(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif, Database db) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterMod 方法");
		}
	}

	/**
	 * DEL前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @param db
	 *            数据库操作对象
	 * @throws ExceptionHandler
	 */
	public int beforeDel(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif, Database db) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforeDel 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * DEL后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @param db
	 *            数据库操作对象
	 * @throws ExceptionHandler
	 */
	public void afterDel(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif, Database db) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterDel 方法");
		}
	}

	/**
	 * View前置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public int beforeView(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 beforeView 方法");
		}
		return INCLUDE_ALL;
	}

	/**
	 * View后置动作
	 * 
	 * @param bizObject
	 *            业务模型对象
	 * @param parameterMap
	 *            表单参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public void afterView(BizObject bizObject, Map<String, String> parameterMap, ServerInterface sif) throws ExceptionHandler {
		if (logger.isDebugEnabled()) {
			logger.debug("执行默认的 afterView 方法");
		}
	}

	/**
	 * 向客户端输出内容
	 * 
	 * @param sif
	 * @param result
	 * @throws ExceptionHandler
	 */
	public void output(ServerInterface sif, String result) throws ExceptionHandler {
		HttpServletResponse response = sif.getServletResponse();
		response.setCharacterEncoding("UTF-8");
		try {
			response.getWriter().write(result);
		} catch (IOException e) {
			throw new ExceptionHandler(e);
		}
	}
}
